all repos — caroster @ 8a3e8f58e43a20afa617f25756e5a3de0b2d0300

[Octree] Group carpool to your event https://caroster.io

frontend/pages/e/[uuid]/index.tsx (view raw)

  1import {useState, useReducer, PropsWithChildren} from 'react';
  2import {makeStyles} from '@material-ui/core/styles';
  3import {useTranslation} from 'react-i18next';
  4import EventLayout, {TabComponent} from '../../../layouts/Event';
  5import TravelColumns from '../../../containers/TravelColumns';
  6import NewTravelDialog from '../../../containers/NewTravelDialog';
  7import VehicleChoiceDialog from '../../../containers/VehicleChoiceDialog';
  8import {
  9  EventByUuidDocument,
 10  FindUserVehiclesDocument,
 11  useFindUserVehiclesQuery,
 12} from '../../../generated/graphql';
 13import Fab from '../../../containers/Fab';
 14import pageUtils from '../../../lib/pageUtils';
 15import {getSession, useSession} from 'next-auth/react';
 16
 17interface Props {
 18  eventUUID: string;
 19}
 20
 21const Page = (props: PropsWithChildren<Props>) => {
 22  return <EventLayout {...props} Tab={TravelsTab} />;
 23};
 24
 25const TravelsTab: TabComponent = (props: {event}) => {
 26  const classes = useStyles();
 27  const {t} = useTranslation();
 28  const session = useSession();
 29  const isAuthenticated = session.status === 'authenticated';
 30  const {data} = useFindUserVehiclesQuery({
 31    skip: !isAuthenticated,
 32  });
 33  const vehicles = data?.me?.profile?.vehicles?.data || [];
 34  const [openNewTravelContext, toggleNewTravel] = useState({opened: false});
 35  const [openVehicleChoice, toggleVehicleChoice] = useReducer(i => !i, false);
 36
 37  const addTravelClickHandler =
 38    isAuthenticated && vehicles?.length != 0
 39      ? toggleVehicleChoice
 40      : () => toggleNewTravel({opened: true});
 41
 42  return (
 43    <>
 44      <TravelColumns toggle={addTravelClickHandler} />
 45      <Fab
 46        onClick={addTravelClickHandler}
 47        aria-label="add-car"
 48        color="primary"
 49        className={classes.bottomRight}
 50      >
 51        {t('travel.creation.title')}
 52      </Fab>
 53      <NewTravelDialog
 54        context={openNewTravelContext}
 55        toggle={() => toggleNewTravel({opened: false})}
 56      />
 57      <VehicleChoiceDialog
 58        open={openVehicleChoice}
 59        toggle={toggleVehicleChoice}
 60        toggleNewTravel={toggleNewTravel}
 61        vehicles={vehicles}
 62      />
 63    </>
 64  );
 65};
 66
 67const useStyles = makeStyles(theme => ({
 68  bottomRight: {
 69    bottom: 0,
 70    right: theme.spacing(6),
 71
 72    [theme.breakpoints.down('sm')]: {
 73      right: theme.spacing(1),
 74      bottom: 56,
 75    },
 76  },
 77}));
 78
 79export const getServerSideProps = pageUtils.getServerSideProps(
 80  async (context, apolloClient) => {
 81    const {uuid} = context.query;
 82    const {host = ''} = context.req.headers;
 83    const session = await getSession(context);
 84
 85    // Fetch event
 86    const {data} = await apolloClient.query({
 87      query: EventByUuidDocument,
 88      variables: {uuid},
 89    });
 90    const event = data?.eventByUUID?.data;
 91
 92    // Fetch user vehicles
 93    if (session)
 94      await apolloClient.query({
 95        query: FindUserVehiclesDocument,
 96      });
 97
 98    return {
 99      eventUUID: uuid,
100      metas: {
101        title: event?.attributes?.name || '',
102        url: `https://${host}${context.resolvedUrl}`,
103      },
104    };
105  }
106);
107
108export default Page;